import { checkAllCartApi, deleteCartApi, findCartListApi, insertCartApi, mergeLocalCartApi, updateCartApi } from '@/api/cart'

/**
 * 存储购物车商品列表数据
 *
 */
export default {
  namespaced: true,
  state: {
    list: []
  },
  getters: {
    // 有效商品列表
    validList: state => {
      // 根据item.isEffective值：true 留下 | false 去掉
      return state.list.filter(item => item.isEffective)
    },
    // 有效商品==选中的商品列表==
    /**
     *
     * @param {*} state 所有state变量
     * @param {*} getters getters计算属性所有变量
     */
    validSeledList (state, getters) {
      return getters.validList.filter(item => item.selected)
    },
    // 有效商品==选中的商品列表==所有商品总价
    /**
     * 单个商品价格计算：商品的现价nowPrice * 商品的数量count
     * == 有效的选中的商品的总价（validSeledList）：每个商品价格之和 ==
     * @param {*} state
     * @param {*} getters
     * @returns
     */
    validSeledListTotal (state, getters) {
      // 写法1：forEach实现
      // 1. 总价
      // let total = 0
      // getters.validSeledList.forEach(item => {
      //   // 2. 累加
      //   total += item.nowPrice * item.count
      // })
      // return total
      return getters.validSeledList.reduce((total, item) => total + item.nowPrice * item.count, 0)
    },
    // 有效商品是否是全部选中状态: true 全部选中 | false 未全部选中（至少有一个没有选中）
    validListSeledAll (state, getters) {
      /**
       * 1. every方法：所有都满足才返回true
       * 2. some方法：只要有一个满足就返回true
       */
      return getters.validList.every(item => item.selected)
    }
  },
  mutations: {
    /**
     * 加入购物车
     * @param {*} state
     * @param {*} skuGood
     */
    addCart (state, skuGood) {
      const index = state.list.findIndex((item) => item.skuId === skuGood.skuId)
      if (index === -1) {
        // 不存在就添加到首位
        state.list.unshift(skuGood)
      } else {
        // 存在=>  state.list[index]获取当前已经存在商品，进行数量增加
        state.list[index].count += skuGood.count
      }
    },
    singleSel (state, { good, sel }) {
      /**
        * 1. 在state.list中找到要修改的商品
        * 2. 修改商品的选中
        */
      const currGood = state.list.find((item) => item.skuId === good.skuId)
      currGood.selected = sel
    },
    /**
     *
     * @param {*} state
     * @param {*} isSelAll 全选框选中的boolean值
     */
    selAll (state, isSelAll) {
      /**
         * 全选和取消全选：
         * 如果全选框：
         * 1. 选中true：列表全部选中
         * 2. 未选中false：列表全部取消选中
         */
      state.list.forEach(item => {
        // 每个商品的选中和全选框选中的值一样的
        item.selected = isSelAll
      })
    },
    // 删除
    deleteAll (state, good) {
      const index = state.list.findIndex(item =>
        item.skuId === good.skuId
      )
      state.list.splice(index, 1)
    },
    modifyAll (state, { good, num }) {
      const modify = state.list.find(item => item.skuId === good.skuId)
      modify.count = num
    },
    /**
     * 购物车列表数据（登陆后）
     * @param {*} state
     * @param {*} list
     */
    setList (state, list) {
      state.list = list
    }

  },
  // 异步请求
  actions: {
    // 合并本地购物车
    async mergeCartAction ({ state, dispatch }) {
      if (state.list.length > 0) {
        const mergeData = state.list.map((item) => {
          return {
            skuId: item.skuId,
            selected: item.selected,
            count: item.count
          }
        })
        // console.log('后台所需的数据', mergeData)
        await mergeLocalCartApi(mergeData)
      }
      // == 调用接口查询=>登录人购物车最新的数据存到vuex=》渲染显示 ==
      dispatch('getCartListAction')
    },
    // 登陆后购物车商品列表
    async getCartListAction ({ commit }) {
      const { data } = await findCartListApi()
      // console.log('登录人的购物车列表：', data)
      commit('setList', data)
    },

    /**
     *
     * @param {*} param0
     * @param {*} skuGood  加入购物车的sku组合商品
     */
    async addCartAction ({ commit, rootState, dispatch }, skuGood) {
      // console.log('action上下文ctx：', skt)
      if (rootState.user.profile.token) {
        // 已经登录
        // console.log('已登录')
        await insertCartApi(skuGood)
        // 加入成功刷新视图
        dispatch('getCartListAction')
      } else {
        // 未登录（今天）
        // console.log('未登录-新增的sku商品信息：', skuGood)
        // 调用mucations方法加入购物车
        commit('addCart', skuGood)
      }
      return '加入购物车成功'
    },
    /**
     * 商品单选
     * @param {*} param0
     * @param {*} skuGood
     * @returns
     */
    async singleSelAction ({ commit, rootState, dispatch }, { good, sel }) {
      // 问题?怎么判断是否登录 =》根据是否有token
      // console.log('action上下文ctx：', ctx)
      if (rootState.user.profile.token) {
        // 已经登录
        // console.log('已登录')
        await updateCartApi({ ...good, selected: sel })
        // 加入成功刷新视图
        dispatch('getCartListAction')
      } else {
        // 未登录
        commit('singleSel', { good, sel })
      }
    },
    // 全选
    async selAllAction ({ commit, rootState, getters, dispatch }, isSelAll) {
      // 问题?怎么判断是否登录 =》根据是否有token
      // console.log('action上下文ctx：', ctx)
      if (rootState.user.profile.token) {
        // 已经登录
        // console.log('已登录')
        const ids = getters.validList.map((item) => item.skuId)
        await checkAllCartApi({ selected: isSelAll, ids })
        // 加入成功刷新视图
        dispatch('getCartListAction')
      } else {
        // 未登录
        commit('selAll', isSelAll)
      }
    },
    // 删除
    async deleteAction ({ commit, rootState, dispatch }, good) {
      // 问题?怎么判断是否登录 =》根据是否有token
      // console.log('action上下文ctx：', ctx)
      if (rootState.user.profile.token) {
        // 已经登录
        // console.log('已登录')
        await deleteCartApi([good.skuId])
        // 删除成功刷新视图
        dispatch('getCartListAction')
      } else {
        // 未登录
        commit('deleteAll', good)
      }
    },
    // 修改
    async modifyAction ({ commit, rootState }, { good, num }) {
      // 问题?怎么判断是否登录 =》根据是否有token
      // console.log('action上下文ctx：', ctx)
      if (rootState.user.profile.token) {
        // 已经登录
        // console.log('已登录')
        await updateCartApi({ ...good, count: num })
      } else {
        // 未登录
        commit('modifyAll', { good, num })
      }
    }
  }
}
